package com.swn.common.redis;

import org.apache.log4j.Logger;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import com.swn.common.util.PropertiesUtil;

/**redis操作工具类
 * 
 * @Author 董士明
 * @Date 2017年9月5日  下午4:20:14
 * @Note <这里是该类的使用注意事项>
 * 修改日期  修改人  修改内容
 * <多次修改需另起一行>
 * @company 济南舒卫能生物技术有限公司
 */
public class RedisUtil {
	  private static Logger logger = Logger.getLogger("RedisUtil.class");
	  private static JedisPool jedisPool=null;    //非切片连接池
	  private int frequencyTemp = 1;              //重新获取redis链接的次数
	  public RedisUtil() 
	    { 
		  newJedisPool();
	    } 
	  private synchronized void newJedisPool() {
		  try{
			   if(jedisPool==null){
					JedisPoolConfig config = new JedisPoolConfig();
					config.setMaxTotal(Integer.parseInt(PropertiesUtil.getValue("redis.properties", "maxTotal")));            // 最大连接数, 默认20个
					config.setMaxIdle(Integer.parseInt(PropertiesUtil.getValue("redis.properties", "maxIdle")));              // 最大空闲连接数, 默认10个
					config.setMaxWaitMillis(Integer.parseInt(PropertiesUtil.getValue("redis.properties", "maxWaitMillis")));  // 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常,
													        // 小于零:阻塞不确定的时间, 默认-1
					config.setTestOnBorrow(true);           // 在获取连接的时候检查有效性, 默认false
					jedisPool=new JedisPool(config, PropertiesUtil.getValue("redis.properties", "url")
								, Integer.parseInt(PropertiesUtil.getValue("redis.properties", "port")), 60000, PropertiesUtil.getValue("redis.properties", "pwd"));
			   }
		  }catch(Exception e){
			  logger.error(e);
		  }
		}
	
	  /**
		 * 获取Jedis连接
		 * @return
		 */
		public Jedis getJedis() {
			Jedis jedis = null;
			// 捕捉异常
			try {
				jedis = jedisPool.getResource();
			} catch (Exception e) {
				logger.error("获取Jedis连接失败了喔,已经开始尝试重置连接池" + frequencyTemp++, e);
				// 产生异常,连接池重置.
				jedisPoolReset();
				// 递归调用
				if (frequencyTemp < 3) {
					jedis = getJedis();
				} else { 
					logger.error("获取不了连接");
					frequencyTemp = 1;
				}
			}
			return jedis;
		}
		/**
		 * jedis连接池重置
		 */
		public void jedisPoolReset() {
			try {
				jedisPool.destroy();
				jedisPool=null;
			} catch (Exception e) {
				logger.error("进行连接重置,出现异常：", e);
			}
			newJedisPool();
		}
	public static void main(String[] args) {
		RedisUtil ss=new RedisUtil();
		Jedis jd=ss.getJedis();
		jd.set("key1", "3050");  
		  System.out.println(jd.get("key1"));
		jd.close();
	}
}
